package com.qianzhou;

import com.qianzhou.pojo.User;

import java.sql.*;

/**
 * qian.zhou
 * 原始的jdbc开发存在的问题如下，数据库连接创建和释放频繁造成系统资源的浪费，从而影响整个系统性能。
 * sql语句在代码中进行硬编写，造成代码不易维护，实际应用中sql变化的可能比较的大，sql变动需要修改java代码
 * 使⽤preparedStatement向占有位符号传参数存在硬编码，因为sql语句的where条件不⼀定，可能多也可能少，修改sql还要修改代码，系统不易维护。
 * 对结果集解析存在硬编码（查询列名），sql变化导致解析代码变化，系统不易维护，如果能将数据库记录封装成pojo对象解析⽐较⽅便
 */
public class JDBCTest {
    public static void main(String[] args) {
        Connection connection = null;
        ResultSet resultSet = null;
        PreparedStatement preparedStatement = null;
        try {
            // 加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            // 创建连接
            String url = "jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8&serverTimezone=GMT";
            String username = "root";
            String password = "123456";
            connection = DriverManager.getConnection(url,username,password);
            String sql = "select * from user where username = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,"lucy");
            resultSet = preparedStatement.executeQuery();
            // 遍历查询的结果
            while(resultSet.next()){
                int id = resultSet.getInt("id");
                String username1 = resultSet.getString("username");
                User user = new User();
                user.setId(id);
                user.setUsername(username1);
                System.out.println(user);
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            if (resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (preparedStatement!=null){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
/**
 * 解决方案：
 * 1.使用数据库连接池初始化连接资源
 * 2.将sql语句抽取到xml配置文件中
 * 3.使⽤反射、内省等底层技术，⾃动将实体与表进⾏属性与字段的⾃动映射
 *
 * 1，读取配置文件信息
 * 读取完成以后已流的形式存在，我们不能将读取到的配置信息以流的形式存在在内存中，而是应当用javaBean的形式来存储
 * （1）Configuration : 存放数据库基本信息、Map<唯⼀标识，Mapper> 唯⼀标识：namespace + "."
 * + id
 * （2）MappedStatement：sql语句、statement类型、输⼊参数java类型、输出参数java类型
 *
 *
 * 1.因此Mybatis是一个优秀的基于ORM的半轻量级持久层框架。它对jdbc进行了封装，
 * 是开发者只需要关注SQL本身，而不需要花费精力去处理例如注册驱动、创建connection、创建
 * statement、手动设置参数、结果集检索等jdbc繁杂的过程代码
 */